{
  "settings": {
    "hasHeaders": true,
    "constrainDragToContainer": true,
    "reorderEnabled": true,
    "selectionEnabled": false,
    "popoutWholeStack": false,
    "blockedPopoutsThrowError": true,
    "closePopoutsOnUnload": true,
    "showPopoutIcon": false,
    "showMaximiseIcon": false,
    "showCloseIcon": false,
    "responsiveMode": "onload",
    "tabOverlapAllowance": 0,
    "reorderOnTabMenuClick": true,
    "tabControlOffset": 10
  },
  "dimensions": {
    "borderWidth": 5,
    "borderGrabWidth": 15,
    "minItemHeight": 10,
    "minItemWidth": 10,
    "headerHeight": 20,
    "dragProxyWidth": 300,
    "dragProxyHeight": 200
  },
  "labels": {
    "close": "close",
    "maximise": "maximise",
    "minimise": "minimise",
    "popout": "open in new window",
    "popin": "pop in",
    "tabDropdown": "additional tabs"
  },
  "content": [
    {
      "type": "row",
      "isClosable": true,
      "reorderEnabled": true,
      "title": "",
      "content": [
        {
          "type": "stack",
          "width": 50,
          "isClosable": true,
          "reorderEnabled": true,
          "title": "",
          "activeItemIndex": 0,
          "content": [
            {
              "type": "component",
              "componentName": "codeEditor",
              "title": "radiator-cleaner.json",
              "componentState": {
                "code": [
                  "function Dxy(currentPoint,dx,dy)",
                  "{",
                  "    let newPoint = [];",
                  "    newPoint[0]  = currentPoint[0] + dx;",
                  "    newPoint[1]  = currentPoint[1] + dy;",
                  "    return newPoint",
                  "}",
                  "",
                  "function Dx(currentPoint,dx)",
                  "{",
                  "    let newPoint = [];",
                  "    newPoint[0]  = currentPoint[0] + dx;",
                  "    newPoint[1]  = currentPoint[1] ;",
                  "    return newPoint",
                  "}",
                  "",
                  "function Dy(currentPoint,dy)",
                  "{",
                  "    let newPoint = [];",
                  "    newPoint[0]  = currentPoint[0];",
                  "    newPoint[1]  = currentPoint[1] + dy;",
                  "    return newPoint",
                  "}",
                  "",
                  "let fingerDepth     = 25;   // how far the prongs stick into the radiator",
                  "let fingerSpace     = 17.8;   // the width of the radiator elements, hence space between fingers",
                  "let fingerThickness = 6;    // the thickness of the fingers or prongs that stick into the radiator",
                  "",
                  "let handDepth       = 22;",
                  "let handleLength    = 90;",
                  "let handleWidth     = 30;",
                  "let handleDist      = ((5 * fingerThickness + 4 * fingerSpace)-handleWidth) / 2;",
                  "let fingerRadius    = 2;",
                  "let handRadius      = 8;",
                  "let handleThickness = 10;",
                  "let holeRadius      = 6;",
                  "let firstHoleY      = 8;",
                  "let holeChamfer     = 1;",
                  "",
                  "let p0 = [0,0];",
                  "",
                  "",
                  "",
                  "// finger 1",
                  "let p1 = Dy(p0, fingerDepth);",
                  "let p2 = Dx(p1, fingerThickness);",
                  "let p3 = Dy(p2,-fingerDepth);",
                  "let p4 = Dx(p3, fingerSpace); ",
                  "",
                  "// finger 2",
                  "let p5 = Dy(p4, fingerDepth);",
                  "let p6 = Dx(p5, fingerThickness);",
                  "let p7 = Dy(p6,-fingerDepth);",
                  "let p8 = Dx(p7, fingerSpace); ",
                  "",
                  "//finger 3",
                  "let p9 = Dy(p8, fingerDepth);",
                  "let p10 = Dx(p9, fingerThickness);",
                  "let p11= Dy(p10,-fingerDepth);",
                  "let p12= Dx(p11, fingerSpace); ",
                  "",
                  "//finger 4",
                  "let p13 = Dy(p12, fingerDepth);",
                  "let p14 = Dx(p13, fingerThickness);",
                  "let p15= Dy(p14,-fingerDepth);",
                  "let p16= Dx(p15, fingerSpace); ",
                  "",
                  "//finger 5",
                  "let p17 = Dy(p16, fingerDepth);",
                  "let p18 = Dx(p17, fingerThickness);",
                  "let p19 = Dy(p18,-fingerDepth);",
                  "",
                  "// hand and handle",
                  "let p20 = Dy(p19,-handDepth);",
                  "let p21 = Dx(p20, -handleDist);",
                  "let p22 = Dy(p21, -handleLength);",
                  "let p23 = Dx(p22,-handleWidth); ",
                  "let p24 = Dy(p23, handleLength);",
                  "let p25 = Dx(p24, -handleDist);",
                  "let p26 = Dy(p25, handDepth);",
                  "",
                  "// sketch of contour",
                  "let cleanerContour = new Sketch(p0)",
                  ".LineTo(p1).Fillet(fingerRadius)",
                  ".LineTo(p2).Fillet(fingerRadius)",
                  ".LineTo(p3).Fillet(fingerRadius)",
                  ".LineTo(p4).Fillet(fingerRadius)",
                  ".LineTo(p5).Fillet(fingerRadius)",
                  ".LineTo(p6).Fillet(fingerRadius)",
                  ".LineTo(p7).Fillet(fingerRadius)",
                  ".LineTo(p8).Fillet(fingerRadius)",
                  ".LineTo(p9).Fillet(fingerRadius)",
                  ".LineTo(p10).Fillet(fingerRadius)",
                  ".LineTo(p11).Fillet(fingerRadius)",
                  ".LineTo(p12).Fillet(fingerRadius)",
                  ".LineTo(p13).Fillet(fingerRadius)",
                  ".LineTo(p14).Fillet(fingerRadius)",
                  ".LineTo(p15).Fillet(fingerRadius)",
                  ".LineTo(p16).Fillet(fingerRadius)",
                  ".LineTo(p17).Fillet(fingerRadius)",
                  ".LineTo(p18).Fillet(fingerRadius)",
                  ".LineTo(p19)",
                  ".LineTo(p20).Fillet(handRadius)",
                  ".LineTo(p21).Fillet(handRadius)",
                  ".LineTo(p22).Fillet(handRadius)",
                  ".LineTo(p23).Fillet(handRadius)",
                  ".LineTo(p24).Fillet(handRadius)",
                  ".LineTo(p25).Fillet(handRadius)",
                  "",
                  ".LineTo(p0)",
                  ".End(true).Face(true);",
                  "",
                  "// Extrude contour and bevel edges",
                  "handle = Extrude(cleanerContour,[0,0,handleThickness]);",
                  "handle = FilletEdges(handle,fingerRadius,[2,3]);",
                  "",
                  "// define centers for holes to make handle lighter",
                  "",
                  "let c1 = [(handleDist + handleWidth/2), -holeRadius * firstHoleY, -0.5*handleThickness];",
                  "let c2 = [(handleDist + handleWidth/2), -holeRadius * (firstHoleY + 3),-0.5*handleThickness];",
                  "let c3 = [(handleDist + handleWidth/2), -holeRadius * (firstHoleY + 6),-0.5*handleThickness];",
                  "let c4 = [(handleDist + handleWidth/2), -holeRadius * (firstHoleY + 9),-0.5*handleThickness];",
                  "",
                  "",
                  "let holeCylinder = Cylinder(holeRadius,handleThickness*2);",
                  "",
                  "let hole_01 = Translate(c1,holeCylinder);",
                  "let hole_02 = Translate(c2,holeCylinder);",
                  "let hole_03 = Translate(c3,holeCylinder);",
                  "let hole_04 = Translate(c4,holeCylinder);",
                  "",
                  "handle_light = Difference(handle,[hole_01,hole_02,hole_03,hole_04],false,0.2,false);",
                  "handle_light = ChamferEdges(handle_light,holeChamfer,[53,54,55,56,96,97,98,99]);",
                  ""
                ]
              },
              "width": 50,
              "isClosable": false,
              "reorderEnabled": true
            }
          ]
        },
        {
          "type": "column",
          "isClosable": true,
          "reorderEnabled": true,
          "title": "",
          "width": 50,
          "content": [
            {
              "type": "stack",
              "height": 80,
              "isClosable": true,
              "reorderEnabled": true,
              "title": "",
              "activeItemIndex": 0,
              "content": [
                {
                  "type": "component",
                  "componentName": "cascadeView",
                  "title": "CAD View",
                  "componentState": {
                    "componentName": "cascadeView",
                    "MeshRes": 0.1,
                    "Cache?": true,
                    "Radius": 30
                  },
                  "isClosable": false,
                  "reorderEnabled": true
                }
              ]
            },
            {
              "type": "stack",
              "height": 20,
              "isClosable": true,
              "reorderEnabled": true,
              "title": "",
              "activeItemIndex": 0,
              "content": [
                {
                  "type": "component",
                  "componentName": "console",
                  "title": "Console",
                  "componentState": {},
                  "height": 20,
                  "isClosable": false,
                  "reorderEnabled": true
                }
              ]
            }
          ]
        }
      ]
    }
  ],
  "isClosable": true,
  "reorderEnabled": true,
  "title": "",
  "openPopouts": [],
  "maximisedItemId": null
}